package application;

import java.util.ArrayList;
import java.util.Scanner;

import javax.xml.parsers.ParserConfigurationException;

import modele.Balade;
import modele.Noeud;

import org.xml.sax.SAXException;

import requetes.LancerRequete;
import requetes.ResultatRequete;
import sparql.RequeteOntologie;
import sparql.TraiterOntologie;
import xml.ParseJDomDoc;
import bdd.GetBDD;
import bdd.RemplirBDD;

/**
 * 
 * @author Florence Delrieu & Coralie Micouin
 * 
 */
public class Main {

	/**
	 * @param args
	 * @throws SAXException
	 * @throws ParserConfigurationException
	 */
	public static void main(String[] args) throws ParserConfigurationException,
			SAXException {
		Scanner saisieUtilisateur = new Scanner(System.in, "Cp1252");
		String s = "";
		int choix = 0;
		String adresseCorpus = "ressources/Collection";
		boolean arret = false;
		String requete = "";
		int nombreDeResultats = 0;
		GetBDD bdd = GetBDD.getInstance();

		s = "############################################################################################################################################################################################\n";
		s += "#\n";
		s += "# Bonjour, bienvenue sur le moteur de recherche codé par Florence Delrieu & Coralie Micouin\n";
		s += "#\n";
		s += "#\n############################################################################################################################################################################################\n";

		// adresse du corpus
		s += "\nL'adresse du corpus est : " + adresseCorpus + "\n";
		s += "Si vous souhaitez modifier cette adresse tapez 1 sinon un autre nombre";
		choix = config(saisieUtilisateur, s);

		// modifie
		if (choix == 1) {
			s = "Vous avez indiqué souhaiter modifier l'adresse du corpus de document.\n";
			s += "Veuillez svp taper la nouvelle adresse du corpus.";
			System.out.println(s);
			if (saisieUtilisateur.hasNext()) {
				adresseCorpus = saisieUtilisateur.next();
				s = "La nouvelle adresse du corpus est " + adresseCorpus;
				System.out.println(s);
			}
		}

		s = "Si vous souhaitez faire une indexation du corpus tapez 1 sinon tapez un autre nombre";
		choix = config(saisieUtilisateur, s);

		// indexation
		if (choix == 1) {
			s = "\nIndexation du corpus en cours ...";
			System.out.println(s);

			// parsage des documents
			Balade b = ParseJDomDoc.parseXmlToJava(adresseCorpus);
			// remplissage de la base
			new RemplirBDD(b);

			s = "Indexation du corpus terminée";
			System.out.println(s);
		}

		s = "Si vous souhaitez utiliser notre moteur de recherche sans ontologie tapez 1, et sinon tapez un autre nombre";

		choix = config(saisieUtilisateur, s);

		// sans ontologie
		if (choix == 1) {
			s = "Maintenant, vous pouvez taper des requêtes (tapez x pour arrêter le programme)";
			System.out.println(s);
			do {
				s = "\nTapez votre requete";
				System.out.println(s);
				if (saisieUtilisateur.hasNextLine()) {
					requete = saisieUtilisateur.nextLine();
					// sinon ca marche pas ... c'est magique (je crois que c'est
					// parce que y a deja un new line qui est fait avant quand
					// on valide avec entree
					requete = saisieUtilisateur.nextLine();

					if (requete.equals("x")) {
						arret = true;
						s = "Arrêt du programme";
						System.out.println(s);
					} else {
						// traitement de la requete
						s = "Tapez le nombre de résultats souhaités ou 0 si vous souhaitez tous les résultats";
						nombreDeResultats = config(saisieUtilisateur, s);

						s = " ###### Traitement de la requête en cours ...\n";
						System.out.println(s);

						ArrayList<String> nosResultats = LancerRequete
								.traiterRequete(nombreDeResultats, requete);

						// On affiche le resultat
						s = "\n ###### Résultat de la requête :\n";
						System.out.println(s);
						for (int i = 0; i < nosResultats.size(); i++) {
							System.out.println(nosResultats.get(i));
						}

						s = "\n ###### Vous pouvez taper une nouvelle requête ou arrêter le programme en tapant x";
						System.out.println(s);
					}
				}
			} while (!arret);
		}

		// avec ontologie
		else {
			String adresseOntologie = "localhost:3030/space";

			// adresse de l'ontologie
			s = "L'adresse de l'ontologie est : " + adresseOntologie + "\n";
			s += "Si vous souhaitez modifier cette adresse tapez 1 sinon un autre nombre";
			choix = config(saisieUtilisateur, s);

			// modifie
			if (choix == 1) {
				s = "Vous avez indiqué souhaiter modifier l'adresse de l'ontologie.\n";
				s += "Veuillez svp taper la nouvelle adresse de l'ontologie.";
				System.out.println(s);
				if (saisieUtilisateur.hasNext()) {
					adresseOntologie = saisieUtilisateur.next();
					s = "La nouvelle adresse de l'ontologie est "
							+ adresseOntologie;
					System.out.println(s);
				}
			}

			s = "Si vous souhaitez lemmatiser l'ontologie (conseillé si l'opération n'a pas déjà été effectuée) tapez 1, et sinon tapez un autre nombre";
			choix = config(saisieUtilisateur, s);

			// lemmatiser l'ontologie
			if (choix == 1) {
				s = "Lemmatisation de l'ontologie en cours ...";
				System.out.println(s);

				// lemmatisation de l'ontologie
				RequeteOntologie sparqlClient = new RequeteOntologie(
						adresseOntologie);
				TraiterOntologie.lemmatiserOntologie(sparqlClient);

				s = "\nLemmatisation de l'ontologie terminée";
				System.out.println(s);
			}

			s = "Maintenant, vous pouvez saisir une requête (tapez x pour arrêter le programme)";
			System.out.println(s);
			do {
				s = "\nTapez votre requete";
				System.out.println(s);
				if (saisieUtilisateur.hasNextLine()) {
					requete = saisieUtilisateur.nextLine();
					// sinon ca marche pas ... c'est magique (je crois que c'est
					// parce que y a deja un new line qui est fait avant quand
					// on valide avec entree
					requete = saisieUtilisateur.nextLine();
					if (requete.equals("x")) {
						arret = true;
						s = "Arrêt du programme";
						System.out.println(s);
					} else {
						// traitement de la requete
						s = "Tapez le nombre de résultats souhaités ou 0 si vous souhaitez tous les résultats";
						nombreDeResultats = config(saisieUtilisateur, s);
						
						// on traite la requete
						s = " ###### Traitement de la requête en cours ...\n";
						System.out.println(s);
						ResultatRequete resultats = TraiterOntologie
								.traiterRequeteParOntologie(requete,
										nombreDeResultats);

						// On recupere les resultats
						ArrayList<String> resultatsTexte = new ArrayList<String>();
						for (Noeud noeud : resultats.getListeNoeuds()) {
							resultatsTexte.add("Collection/"
									+ bdd.recupererDocsFromId(noeud
											.getIdDocument()) + "\t"
									+ noeud.getxPath());
						}

						// Afficher le resultat
						s = "\n ###### Résultat de la requête :\n";
						System.out.println(s);
						for (int i = 0; i < resultatsTexte.size(); i++) {
							System.out.println(resultatsTexte.get(i));
						}

						s = "\n ###### Vous pouvez taper une nouvelle requête ou arrêter le programme en tapant x";
						System.out.println(s);
					}
				}
			} while (!arret);
		}
		bdd.fermeConnexion();
	}

	public static int config(Scanner saisieUtilisateur, String s) {
		int choix = -1;

		do {
			System.out.println(s);
			if (saisieUtilisateur.hasNextInt()) {
				choix = saisieUtilisateur.nextInt();
			} else if (saisieUtilisateur.hasNext()) {
				saisieUtilisateur.next();
				System.out.println("Vous devez rentrer un entier");
				choix = -1;
			}
		} while (choix == -1);

		return choix;
	}

}
